package m

import (
	"GameServer/Game/cache"
	"GameServer/Game/dbmodule"
	"GameServer/Game/errors"

	"github.com/globalsign/mgo/bson"
	log "github.com/sirupsen/logrus"
)

// 新兵训练营
type RecruitTrain struct {
	BaseM
	Uid   bson.ObjectId      `bson:"_id" json:"_id"`     // 用户Uid
	Finsh int64              `bson:"finsh" json:"finsh"` // 所有任务完成值为1，否者值为0
	State map[int64]*RTState `bson:"state" json:"state"` // 新手练兵状态
}

type RTState struct {
	Tid          int64 `bson:"tid" json:"tid"`                   // 配表id
	LevelState   int64 `bson:"levelState" json:"levelState"`     // 关卡达成状态 0.未完成 1.完成
	StarState    int64 `bson:"starState" json:"starState"`       // 星星数量达成装填 0.未完成 1.完成
	MonsterState int64 `bson:"monsterState" json:"monsterState"` // 杀怪状态 0.未完成 1.完成
	State        int64 `bson:"state" json:"state"`               // 奖励领取状态 0.不能领取 1.可领取 2.已领取
}

// 新兵训练营：创建
func NewRecruitTrain() cache.EntryI {
	return &RecruitTrain{State: make(map[int64]*RTState)}
}

// 新兵训练营：保存信息
func (rt *RecruitTrain) Save() (err error) {
	err = dbmodule.MgoDB.GameDB.Upsert("RecruitTrain", bson.M{"_id": rt.Uid}, rt)
	return
}

// 新兵训练营：加载
func (rt *RecruitTrain) Load(key interface{}) (err error) {
	switch key.(type) {
	case string:
		if key.(string) == "" {
			return errors.New("无效的key load, key empty")
		}
		rt.Uid = bson.ObjectIdHex(key.(string))
	case bson.ObjectId:
		rt.Uid = key.(bson.ObjectId)
	default:
		log.WithFields(log.Fields{
			"method": "RecruitTrain_Load",
			"data":   key,
		}).Error("无效的key load")
		return errors.New("无效的key load")
	}
	return rt.LoadData()
}

// 新兵训练营：加载数据
func (rt *RecruitTrain) LoadData() (err error) {
	err = dbmodule.MgoDB.GameDB.FindOne("RecruitTrain", bson.M{"_id": rt.Uid}, nil, &rt)
	if err != nil {
		if err.Error() == "not found" {
			return nil
		}
		return
	}
	return
}

// 新兵训练营：更新数据
func (rt *RecruitTrain) Update(val *RecruitTrain) {
	Cache.Put("RecruitTrain", val.Uid.Hex(), val)
	val.UpdateData()
}

// 新兵训练营：获取数据
func GetRecruitTrain(uid string) *RecruitTrain {
	v, _ := Cache.Get("RecruitTrain", uid)
	return v.(*RecruitTrain)
}
